package com.creative.core.uitls;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.creative.core.domain.AjaxResult;
import com.google.zxing.*;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeWriter;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.List;

import static cn.hutool.core.img.ImgUtil.IMAGE_TYPE_PNG;

/**
 * 二维码相关工具方法
 * 创建人: ling
 * 创建时间: 2024/12/30
 */
public class QRCodeUtil {
    /**
     * 生成指定网址大小及图片格式的二维码
     *
     * @param url      网址
     * @param size     尺寸
     * @param fileType 二维码图片格式
     * @param qrFile   生成图片保存地址
     */
    private static void createQRCode(String url, int size, String fileType, File qrFile)
            throws WriterException, IOException {
        url = "https://mp.diandianjfb.com/web/index.getwechatuserinfo";
        qrFile = new File("E:/大四上学期/网盘项目/前端/pan/src/assets");
        HashMap<EncodeHintType, Object> hintMap = new HashMap<EncodeHintType, Object>();
        hintMap.put(EncodeHintType.CHARACTER_SET, "UTF-8");
//        用 QRCodeWriter 类和 BitMatrix 类来生成一个 QR 码的二进制矩阵，并将其转换为一个 BufferedImage 对象
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        BitMatrix bitMatrix = qrCodeWriter.encode(url, BarcodeFormat.QR_CODE, size, size, hintMap);

        int matrixWidth = bitMatrix.getWidth();
        BufferedImage image = new BufferedImage(matrixWidth, matrixWidth, BufferedImage.TYPE_INT_RGB);
//        它在 BufferedImage 上创建一个 Graphics2D 对象以将 QR 码绘制为黑色的像素点
        image.createGraphics();

        Graphics2D graphics = (Graphics2D) image.getGraphics();
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, matrixWidth, matrixWidth);
        graphics.setColor(Color.BLACK);

        for (int i = 0; i < matrixWidth; i++) {
            for (int j = 0; j < matrixWidth; j++) {
                if (bitMatrix.get(i, j)) {
                    graphics.fillRect(i, j, 1, 1);
                }
            }
        }
//        用 ImageIO 将 BufferedImage 对象写入到指定类型的文件
        ImageIO.write(image, fileType, qrFile);
    }

    /**
     * 读取二维码网址,实现二维码的扫描功能
     * scanQRCode(String filePath) 方法接收一个文件路径参数，它会读取该文件，并将其转换成 BufferedImage 对象。
     * 接着，创建一个 LuminanceSource 源对象，并使用 RGBLuminanceSource 类从 BufferedImage 对象中获取像素数据。
     * 然后，使用 HybridBinarizer 类创建 BinaryBitmap 对象，用于表示二值化后的图像，也就是只有黑和白两种颜色的图像。
     * 接着，使用 MultiFormatReader 类解码 BinaryBitmap 对象，解析出其中的信息，并将其打印出来
     */
    public static String scanQRCode(String filePath) {
        String url = "";
        try {
            File file = new File(filePath);
            BufferedImage image = ImageIO.read(file);
            LuminanceSource source = new RGBLuminanceSource(image.getWidth(), image.getHeight(), getPixels(image));
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
            Result result = new MultiFormatReader().decode(bitmap);
            url = result.getText();
            System.out.println("二维码中的网址为：" + url);
        } catch (IOException | ReaderException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return url;
    }

    /**
     * 获取像素
     * getPixels(BufferedImage image)是一个辅助方法，用于从 BufferedImage 对象中获取像素数据。
     * 它首先获取图像的宽度和高度，然后创建一个像素数组，并使用 getRGB() 方法从 BufferedImage 对象中获取像素数据，
     * 把它存储在像素数组中，并返回该数组
     *
     * @param image 图片
     * @return {@link int[] }
     * @author ling
     * @date 2024/12/30
     *///获取图像的像素数据
    private static int[] getPixels(BufferedImage image) {
        int width = image.getWidth();
        int height = image.getHeight();
        int[] pixels = new int[width * height];
        image.getRGB(0, 0, width, height, pixels, 0, width);
        return pixels;
    }

    /**
     * 根据网址跳转
     */
    public static void dropUrl(String url) {
        try {
            //调用系统默认浏览器打开指定URL
            Desktop.getDesktop().browse(new URI(url));
        } catch (IOException | URISyntaxException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成二维码Base64字符串
     *
     * @param earTagNumber 耳标编号
     * @return {@link String }
     * @author ling
     * @date 2025/02/21
     */
    @GetMapping("/getLivestockTransferQrCode")
    public AjaxResult getLivestockTransferQrCode(@RequestParam String earTagNumber) throws FileNotFoundException {

  /*      if (StrUtil.isBlank(earTagNumber)) {
            return AjaxResult.error("参数为空");
        }
//        获取链接所需参数
        LivestockTransferEntity livestockTransferEntity = new LivestockTransferEntity();
        livestockTransferEntity.setEarTagNumber(earTagNumber);
        List<LivestockTransferEntity> list = livestockTransferService.findList(livestockTransferEntity);
//        取出list中的对象
        if (CollUtil.isNotEmpty(list)) {
            livestockTransferEntity = list.get(0);
        }
        String earTagNumber1 = livestockTransferEntity.getEarTagNumber();
//        链接
        String url = "http://localhost:8081/#/showData?earTagNumber=" + earTagNumber1;
        // 生成指定url对应的二维码到文件，宽和高都是300像素
        QrConfig config = new QrConfig(300, 300);
        // 设置边距，既二维码和背景之间的边距
        config.setMargin(1);
        // 设置中间的 logo 图片
        String logoPath = ResourceUtils.getFile("classpath:image/cysc.png").getPath();
        System.out.println("==============================" + logoPath);
        config.setImg(logoPath);

        return Result.data(QrCodeUtil.generateAsBase64(url, config, IMAGE_TYPE_PNG));*/
        return  null;
    }

}
